#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int MAXN=1005;
//顶点数和边数
int V,E;
//邻接矩阵保存顶点关系
vector<int> G[MAXN];
//保存顶点颜色 （-1和1） 0代表未涂色
int color[MAXN];
//将v涂成c颜色
bool dfs(int v,int c){
    color[v]=c;
    for(int i=0;i<G[v].size();i++){
        //相邻顶点不能同色
        if(color[G[v][i]]==c){
            return false;
        }
        //如果未涂色则尝试递归涂色，如果失败返回false，则该判断也false
        if(color[G[v][i]]==0 && !dfs(G[v][i],-c)){
            return false;
        }
    }
    return true;
}
void solve(){
    for(int i=0;i<V;i++){
        if(color[i]==0){
            if(!dfs(i,1)){
                printf("No\n");
                return;
            }
        }
    }
    printf("Yes\n");
}
int main(void){
    scanf("%d%d",&V,&E);
    int s,t;
    for(int i=0;i<V;i++){
        scanf("%d%d",&s,&t);
        //无向图
        G[s].push_back(t);
        G[t].push_back(s);
    }
    solve();
    return 0;
}
